<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" >

<title>FineUICore项目组件化和打包 | 没想好的个人博客</title>

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

<!-- <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> -->
   <!-- Font Awesome CSS-->
   <link href="https://cdn.bootcss.com/font-awesome/5.13.0/css/all.css" rel="stylesheet">

   <link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/5.7.2/css/all.min.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">

<link rel="shortcut icon" href="https://shixixiyue.gitee.io//favicon.ico?v=1709791195950">
<link rel="stylesheet" href="https://shixixiyue.gitee.io//styles/main.css">



<link rel="stylesheet" href="https://unpkg.com/aos@next/dist/aos.css" />
<script src="https://jsd.onmicrosoft.cn/npm/vue/dist/vue.js"></script>


<style>
  .hljs-ln{
    padding-bottom: 1.2rem;
    margin: 0rem !important;
  }
  .hljs-ln td {
    border: none !important;
    padding: 2px 6px !important;
    line-height: 1.2rem;
    font-size: 1rem;
  }
  .hljs-ln tr td:first-child  {
    color: cadetblue;
    border-right: 1px solid !important;
  }
  .hljs-ln tr {
    border: none !important;
  }
</style>

    <meta name="description" content="之前一直用FineUICore做框架，系统登录，人员 字典 菜单 权限管理啥的，公司也一直在用，但是框架分散在各项目不好维护，所以个给组件化了，在项目中引用，并且打包放在了公司的服务器上，这里做个积累






1. 组件化
2. 打包管..." />
    <meta name="keywords" content="FineUICore,.Net Core" />
  </head>
  <body>
    <div id="app" class="main">

      <div class="sidebar" :class="{ 'full-height': menuVisible }">
  <div class="top-container" data-aos="fade-right">
    <div class="top-header-container">
      <a class="site-title-container" href="https://shixixiyue.gitee.io/">
        <img src="https://shixixiyue.gitee.io//images/avatar.png?v=1709791195950" class="site-logo">
        <h1 class="site-title">没想好的个人博客</h1>
      </a>
      <div class="menu-btn" @click="menuVisible = !menuVisible">
        <div class="line"></div>
      </div>
    </div>
    <div>
      
        
          <a href="https://shixixiyue.gitee.io/" class="site-nav">
            首页
          </a>
        
      
        
          <a href="https://shixixiyue.gitee.io//tag/4gOKry8Qv/" class="site-nav">
            .Net Core
          </a>
        
      
        
          <a href="https://shixixiyue.gitee.io//tag/njETBpqXu/" class="site-nav">
            FineUICore
          </a>
        
      
        
          <a href="https://shixixiyue.gitee.io//tag/XyXyeLOBB" class="site-nav">
            读书笔记
          </a>
        
      
        
          <a href="https://shixixiyue.gitee.io//tag/TyVX6hfCJ" class="site-nav">
            Vue笔记
          </a>
        
      
        
          <a href="https://shixixiyue.gitee.io//tag/3Hz2sPtzO/" class="site-nav">
            产品
          </a>
        
      
        
          <a href="https://shixixiyue.gitee.io//tag/Db1wShB_E" class="site-nav">
            其他
          </a>
        
      
        
          <a href="https://shixixiyue.gitee.io/" class="site-nav">
            一一一一一一一一一
          </a>
        
      
        
          <a href="https://shixixiyue.gitee.io//archives" class="site-nav">
            文章归档
          </a>
        
      
        
          <a href="https://shixixiyue.gitee.io//tags" class="site-nav">
            全部标签
          </a>
        
      
    </div>
  </div>
  <div class="bottom-container" data-aos="flip-up" data-aos-offset="0">
    <div class="social-container">
      
        
      
        
      
        
      
        
      
        
      
    </div>
    <div class="site-description">
      没事啥都说
    </div>
    <div class="site-footer">
      QQ：<a href="tencent://message/?uin=935732994&Site=''&Menu=yes">935732994<a/> <a href="http://beian.miit.gov.cn">京ICP备2024045283号<a/> | <a class="rss" href="https://shixixiyue.gitee.io//atom.xml" target="_blank">RSS</a>
    </div>
  </div>
</div>


      <div class="main-container">
        <div class="content-container" data-aos="fade-up">
          <div class="post-detail">
            <h2 class="post-title">FineUICore项目组件化和打包</h2>
            <div class="post-date">2023-03-10
            
                
                  <a href="https://shixixiyue.gitee.io/tag/njETBpqXu/" class="tag">
                    FineUICore
                  </a>
                
                  <a href="https://shixixiyue.gitee.io/tag/4gOKry8Qv/" class="tag">
                    .Net Core
                  </a>
                
            </div>
            
              <div class="feature-container" style="background-image: url('https://shixixiyue.gitee.io//post-images/fineuicore-xiang-mu-zu-jian-hua-he-da-bao.png')">
              </div>
            
            <div class="post-content" v-pre>
              <p>之前一直用FineUICore做框架，系统登录，人员 字典 菜单 权限管理啥的，公司也一直在用，但是框架分散在各项目不好维护，所以个给组件化了，在项目中引用，并且打包放在了公司的服务器上，这里做个积累</p>
<!-- more -->
<p><ul class="markdownIt-TOC">
<li>
<ul>
<li>
<ul>
<li><a href="#1-%E7%BB%84%E4%BB%B6%E5%8C%96">1. 组件化</a></li>
<li><a href="#2-%E6%89%93%E5%8C%85%E7%AE%A1%E7%90%86">2. 打包管理</a>
<ul>
<li><a href="#21-%E5%AE%89%E8%A3%85nuget%E7%A7%81%E6%9C%8D">2.1 安装Nuget私服</a></li>
<li><a href="#22-%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83%E5%91%BD%E4%BB%A4">2.2 打包发布命令</a></li>
</ul>
</li>
<li><a href="#3-%E9%97%AE%E9%A2%98">3. 问题</a>
<ul>
<li><a href="#31-%E7%89%88%E6%9C%AC%E5%8F%B7">3.1 版本号</a></li>
<li><a href="#32-%E9%9D%99%E6%80%81%E6%96%87%E4%BB%B6%E6%89%93%E5%8C%85">3.2 静态文件打包</a></li>
<li><a href="#33-%E5%8A%A8%E6%80%81%E7%BB%84%E4%BB%B6%E5%BC%95%E7%94%A8com%E7%BB%84%E4%BB%B6">3.3 动态组件引用（COM组件）</a></li>
</ul>
</li>
<li><a href="#%E5%85%B6%E4%BB%96">其他</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</p>
<h3 id="1-组件化">1. 组件化</h3>
<p>之前一直不知道MVC（带Controller）的项目怎么像dll一样给另一个项目引用并加载视图，直到学习了<a href="https://www.cnblogs.com/lwqlun/p/11137788.html#4310745">从零开始实现ASP.NET Core MVC的插件式开发</a></p>
<p>只要跟着文章一点点试就能出来，这里要注意使用框架项目和实例项目要使用同样的包引用和.net版本否则编译不了</p>
<p>最后像这样 (HD_System 就是编译好的组件)</p>
<pre><code> var assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + &quot;HD_System.Web.dll&quot;);
 
services.AddControllers(option =&gt;
{
    option.Filters.Add(typeof(GlobalExceptionsFilter));
}).AddNewtonsoftJson(opt =&gt;
{
    //忽略循环引用
    opt.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    //不改变字段大小
    opt.SerializerSettings.ContractResolver = new DefaultContractResolver();
    //不改变字段大小
    //opt.SerializerSettings.ContractResolver = new CustomContractResolver();
})
.AddApplicationPart(assembly);
</code></pre>
<p>这里带来的问题是 每次框架项目（HDSystem）修改都要复制dll到各实例项目，要复制一堆，前期我写了个 bat 的脚本，在项目编译前复制文件到项目的 bin 目录下，但是每个项目都在本地写脚本对于多人异地开发带来不便，这里就用到 <code>Nuget 包管理</code>；</p>
<h3 id="2-打包管理">2. 打包管理</h3>
<h4 id="21-安装nuget私服">2.1 安装Nuget私服</h4>
<p>由于只供本地使用，所以搭建本地的Nuget服务器 <a href="https://loic-sharma.github.io/BaGet/">BaGet</a> ,官网了搭建流程非常详细，这里不做说明；把发布的包下下来，摁到服务器上发布就行了，这个项目也是用.net写的，直接 dotnet BaGet.dll 就行了；</p>
<p>然后再VS2022中配置私服地址，可以看这里 <a href="https://www.shuzhiduo.com/A/Ae5Rk2BLdQ/">基于 BaGet 搭建 Nuget 服务器</a></p>
<p>在Baget的配置（appsettings.json）中，我只修改了一个配置 <code>&quot;AllowPackageOverwrites&quot;: true</code>，允许包覆盖 因为可能上传的版本老是修改 懒的改版本号；</p>
<h4 id="22-打包发布命令">2.2 打包发布命令</h4>
<p>我还学习研究了官方的 <a href="https://learn.microsoft.com/zh-cn/nuget/reference/nuspec#specifying-files-to-include-in-the-package">Nuget命令</a> ；看的不老懂的</p>
<p>这里我还是使用了git钩子，由于源码传到Linux服务器（CentOS7），这里上传后直接触发脚本打包并发布到Nuget私服</p>
<p>通过脚本进行项目的打包 即 <code>dotnet pack</code> 命令，注意要 cd 到项目目录下，如：</p>
<pre><code>
echo '-------------开始打包---------------'

#打包后地址
PackagePath='/home/HD_System/NugetPackage'

#运行打包
cd /home/HD_System/HD_System/HD.Commons

#dotnet pack 项目文件 --output 地址
dotnet pack HD.Commons.csproj --output $PackagePath
</code></pre>
<p>最后推送到服务器</p>
<pre><code>echo '-------------开始推送-------------'
cd $PackagePath
dotnet nuget push &quot;*.nupkg&quot; -s http://127.0.0.1:9090/v3/index.json --skip-duplicate
</code></pre>
<h3 id="3-问题">3. 问题</h3>
<p>正常到这里项目就能拉到了，一安装就可以用了，然后问题就来了；</p>
<h4 id="31-版本号">3.1 版本号</h4>
<p>遇到的第一个问题是版本号，由于框架项目也是多一个项目（.csproj，比如 公共库 业务 UI扩展 Web项目）组成<br>
，互相引用，每个项目都单独发包了（解耦），这里要注意 底层项目的版本号变更，上层的也要变更，否则上层项目打包之后 会提示 找不到版本（他会找旧的库），</p>
<p>因为 <code>dotnet pack</code> 时如果当前项目的版本号没有更新，它是不重新编译的，只会把缓存直接拿出来告诉你打包完了，其实包没变，所以引用的还是旧版的基础包；</p>
<p>关于版本号，只要在vs中双击项目，直接修改就行了</p>
<pre><code>&lt;Project Sdk=&quot;Microsoft.NET.Sdk.Web&quot;&gt;
    &lt;PropertyGroup&gt;
        &lt;Authors&gt;没想好&lt;/Authors&gt;
	    &lt;Title&gt;HD_System 框架基础文件&lt;/Title&gt;
        &lt;Version&gt;1.0.1.24&lt;/Version&gt;
    &lt;/PropertyGroup&gt;
&lt;/Project&gt;
</code></pre>
<h4 id="32-静态文件打包">3.2 静态文件打包</h4>
<p>微软官方的教程里 说 <code>dotnet pack</code> 不能打包Web项目，只能打包类库，但是我一开始就要解决的是 Web项目组件化 ，实例项目读取的是动态的 dll 文件 ，而不是引用该dll</p>
<pre><code> var assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + &quot;HD_System.Web.dll&quot;);
</code></pre>
<p>所以Web项目生成的dll文件，只作为静态文件就可以了，在实例项目运行时将文件复制到发布目录即可；同样 js css 图片文件（FineUI环境）也是静态文件，这些文件要复制到项目的wwwroot下，并且要保持路径；（这两个需求我测试70多个版本，终于成功了）</p>
<p>思路是原框架项目在服务编译发布（不是打包），得到 dll 和 wwwroot ；将静态文件 复制到一个空项目下，由该空项目执行打包，读取的配置文件是<code>.nuspec</code>，执行的规则是<code>.targets</code></p>
<p>首先新建 文件夹 WebNuspec，包含文件如下</p>
<pre><code>build
    ∟--HD_System.Web.dll        --静态dll
    ∟--HD_System.Web.targets    --规则
    ∟--wwwroot                  --静态文件
        ∟--res...               --js等
contentFiles
    ∟--any
        ∟--any
            ∟--wwwroot          --静态文件 同上
                ∟--res...
HD_System.Web.nuspec            --配置
WebNuspec.csproj                --空项目
</code></pre>
<p>HD_System.Web.nuspec 文件内容</p>
<pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;package xmlns=&quot;http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd&quot;&gt;
  &lt;metadata&gt;
    &lt;id&gt;HD_System.Web&lt;/id&gt;
    &lt;version&gt;1.0.1.24&lt;/version&gt;
    &lt;contentFiles&gt;
      &lt;files include=&quot;*.dll&quot; buildAction=&quot;Build&quot;&gt;&lt;/files&gt;
      &lt;files include=&quot;**/*&quot; buildAction=&quot;None&quot;   /&gt;
      &lt;files include=&quot;HD_System.Web.targets&quot; buildAction=&quot;Build&quot;&gt;&lt;/files&gt;
    &lt;/contentFiles&gt;
  &lt;/metadata&gt;
&lt;/package&gt;
~                    
</code></pre>
<p>WebNuspec.csproj  文件内容</p>
<pre><code>&lt;Project Sdk=&quot;Microsoft.NET.Sdk&quot;&gt;
  &lt;PropertyGroup&gt;
    &lt;TargetFramework&gt;net7.0&lt;/TargetFramework&gt;
    &lt;NoBuild&gt;true&lt;/NoBuild&gt;
    &lt;IncludeBuildOutput&gt;false&lt;/IncludeBuildOutput&gt;
    &lt;NuspecFile&gt;PATH_TO_NUSPEC_FILE&lt;/NuspecFile&gt;
  &lt;/PropertyGroup&gt;
&lt;/Project&gt;               
</code></pre>
<p>HD_System.Web.targets 文件内容</p>
<pre><code>&lt;Project xmlns=&quot;http://schemas.microsoft.com/developer/msbuild/2003&quot;&gt;
    &lt;ItemGroup&gt;
        &lt;!-- 如果是dll 复制到发布文件 --&gt;
        &lt;None Include=&quot;$(MSBuildThisFileDirectory)\*.dll&quot;&gt;
            &lt;Link&gt;%(Filename)%(Extension)&lt;/Link&gt;
            &lt;CopyToOutputDirectory&gt;PreserveNewest&lt;/CopyToOutputDirectory&gt;
        &lt;/None&gt;
    &lt;/ItemGroup&gt;
     &lt;!-- 这里执行的是wwwroot的复制 --&gt;
    &lt;Target Name=&quot;CopyScriptsToProject&quot; BeforeTargets=&quot;PrepareForBuild&quot;&gt;
        &lt;ItemGroup&gt;
          &lt;SourceScriptFiles Include=&quot;$(MSBuildThisFileDirectory)\wwwroot\**\*.*&quot; /&gt;
        &lt;/ItemGroup&gt;
        &lt;Copy SourceFiles=&quot;@(SourceScriptFiles)&quot; DestinationFiles=&quot;$(ProjectDir)\wwwroot\%(RecursiveDir)%(Filename)%(Extension)&quot;/&gt;
  &lt;/Target&gt;
&lt;/Project&gt;
               
</code></pre>
<p>打包和复制目录命令</p>
<pre><code>dotnet publish HD_System.Web.csproj -r linux-x64 -p:PublishDir=bin/publish

#复制目录
cp -r 略/wwwroot/* 略/WebNuspec/contentFiles/any/any/wwwroot
#复制文件
cp 略/bin/publish/HD_System.Web.dll 略/WebNuspec/build/HD_System.Web.dll

</code></pre>
<p>发布时 cd 到这个目录下，还是执行 <code>dotnet pack</code></p>
<pre><code>cd /home/HD_System/HD_System/WebNuspec

#执行空项目的打包 但是配置文件读取 HD_System.Web.nuspec
dotnet pack WebNuspec.csproj -p:NuspecFile=HD_System.Web.nuspec --output $PackagePath

</code></pre>
<p>问题又来了，使用<code>-p:NuspecFile</code>命令后 版本放不上，读取的是 HD_System.Web.nuspec 文件中的版本号，所以要读取原始项目的版本号将 HD_System.Web.nuspec 文件中的版本号替换，说白就是读取xml，在改变一个xml项，代码如下</p>
<pre><code>#得到版本号
cd /home/HD_System/HD_System/HD.System.Web/
TARGET_XML_FLIE=HD_System.Web.csproj #原项目文件 读取Version字段
Version=`grep -E -o -e '&lt;Version&gt;.+&lt;/Version&gt;' $TARGET_XML_FLIE | sed 's/&lt;Version&gt;//g'|sed 's/&lt;\/Version&gt;//g'`
echo $Version

#修改版本号
cd /home/HD_System/HD_System/WebNuspec
function change(){
    if [ $# -eq 3 ]; then
        sed -i 's/&lt;'&quot;$1&quot;\&gt;'.*&lt;/&lt;'&quot;$1&quot;'\&gt;'&quot;$2&quot;'&lt;/g' $3
    else
        echo error
    fi
}
change version $Version HD_System.Web.nuspec
</code></pre>
<h4 id="33-动态组件引用com组件">3.3 动态组件引用（COM组件）</h4>
<p>Nuget打包，可以把同样是Nuget安装的文件一块都打包了，实例项目不用引用直接就能还原上，但是对于dll文件的打包，比如FineUICore.dll，在框架项目中引用，在实例项目中我希望自动引用；</p>
<p>在 HD.UIControl.csproj 中加入这句就可以了 (该功能由BingAI提供)</p>
<pre><code>&lt;!--包含在项目中--&gt;
&lt;ItemGroup&gt;
	&lt;Reference Include=&quot;FineUICore&quot;&gt;
		&lt;HintPath&gt;bin\FineUICore.dll&lt;/HintPath&gt;
	&lt;/Reference&gt;
&lt;/ItemGroup&gt;
&lt;!--输出到打包目录--&gt;
&lt;ItemGroup&gt;
	&lt;None Include=&quot;bin\FineUICore.dll&quot; Pack=&quot;true&quot; PackagePath=&quot;lib\net7.0&quot; /&gt;
	&lt;None Include=&quot;bin\FineUICore.xml&quot; Pack=&quot;true&quot; PackagePath=&quot;lib\net7.0&quot; /&gt;
&lt;/ItemGroup&gt;
</code></pre>
<h3 id="其他">其他</h3>
<p>本地nuget缓存，<br>
删除缓存版本 C:\Users\shiyu.nuget\packages</p>
<p>libstdc++ 找不到</p>
<blockquote>
<p>yum install glibc-static libstdc++-static -y</p>
</blockquote>
<p><a href="https://www.bbsmax.com/A/l1dygDjGJe/">Nuget一键打包上传以及高级应用</a></p>
<p><a href="https://www.wp2.cn/other/%E5%A6%82%E4%BD%95%E4%B8%BA%E5%BC%95%E7%94%A8%E7%9A%84-nuget-%E5%8C%85%E6%8C%87%E5%AE%9A%E8%BE%93%E5%87%BA%E6%96%87%E4%BB%B6%E5%A4%B9/">如何为引用的 nuget 包指定输出文件夹?</a></p>
<p><a href="https://learn.microsoft.com/zh-cn/visualstudio/msbuild/copy-task?view=vs-2022"> MSBuild Copy 任务参考 </a></p>
<hr>
<p>至此所有问题解决，实现了源码和静态文件的包管理，</p>
<ul>
<li>框架项目修改，更新版本号，提交到Git；</li>
<li>服务器拉-编译-发布\打包-发布到Nuget私服；</li>
<li>实例项目引用\更新包，自动引用 FineUICore.dll，编译时复制 HD_System.Web.dll 到输出目录，复制框架下 wwwroot 文件到项目</li>
</ul>

            </div>
            
              <div class="tag-container">
                
                  <a href="https://shixixiyue.gitee.io/tag/njETBpqXu/" class="tag">
                    FineUICore
                  </a>
                
                  <a href="https://shixixiyue.gitee.io/tag/4gOKry8Qv/" class="tag">
                    .Net Core
                  </a>
                
              </div>
            
            
              <div class="next-post">
                <div class="next">下一篇</div>
                <a href="https://shixixiyue.gitee.io/fineui-qian-duan-kuo-zhan-you-chang/">
                  <h3 class="post-title">
                    FineUI 前端扩展-有偿
                  </h3>
                </a>
              </div>
            

            

          </div>

        </div>
      </div>
    </div>

    <script src="https://unpkg.com/aos@next/dist/aos.js"></script>
<script type="application/javascript">

AOS.init();

var app = new Vue({
  el: '#app',
  data: {
    menuVisible: false,
  },
})

</script>


  <script src="//jsd.onmicrosoft.cn/gh/highlightjs/cdn-release@11.5.1/build/highlight.min.js"></script>
  <script>
    hljs.initHighlightingOnLoad();
    //hljs.registerLanguage('mermaid', window.hljsDefineMermaid);
  </script>
  <script src="//jsd.onmicrosoft.cn/npm/highlightjs-line-numbers.js@2.8.0/dist/highlightjs-line-numbers.min.js"></script>
  <script>
    hljs.initLineNumbersOnLoad({
      singleLine: true
    });
  </script>
 <script src="https://jsd.onmicrosoft.cn/npm/mermaid/dist/mermaid.min.js"></script>
   <script>
    mermaid.initialize({
      startOnLoad: true,
      securityLevel: 'loose',
    });
  </script>





  </body>
</html>
